import {
  Injectable,
  BadRequestException,
  HttpException,
  HttpStatus,
} from '@nestjs/common';
import { extname } from 'path';
import * as fs from 'fs';
import * as path from 'path';
import { v4 as uuidv4 } from 'uuid';

@Injectable()
export class AvatarUploadService {
  // 确保上传目录存在
  private ensureUploadsDir(): void {
    const uploadsDir = './uploads/avatars';
    if (!fs.existsSync(uploadsDir)) {
      try {
        fs.mkdirSync(uploadsDir, { recursive: true });
      } catch (error) {
        throw new HttpException(
          '创建上传目录失败',
          HttpStatus.INTERNAL_SERVER_ERROR,
        );
      }
    }
  }

  // 生成唯一文件名
  private generateUniqueFilename(file): string {
    const uniqueName = uuidv4();
    const extension = extname(file.originalname);
    return `${uniqueName}${extension}`;
  }

  // 验证图片文件类型
  private validateImageType(file): boolean {
    const allowedMimeTypes = [
      'image/jpeg',
      'image/jpg',
      'image/png',
      'image/gif',
      'image/webp',
    ];

    return allowedMimeTypes.includes(file.mimetype);
  }

  // 验证图片文件大小（最大2MB）
  private validateImageSize(file): boolean {
    const maxSize = 2 * 1024 * 1024; // 2MB
    return file.size <= maxSize;
  }

  // 保存头像文件
  public async saveAvatar(file: Express.Multer.File): Promise<string> {
    if (!file) {
      throw new BadRequestException('请上传头像文件');
    }

    // 验证文件类型
    if (!this.validateImageType(file)) {
      throw new BadRequestException(
        '不支持的图片格式。仅支持JPG、PNG、GIF、WebP格式。',
      );
    }

    // 验证文件大小
    if (!this.validateImageSize(file)) {
      throw new BadRequestException('文件大小超过限制。最大支持2MB。');
    }

    // 确保上传目录存在
    this.ensureUploadsDir();

    // 由于Multer的FileInterceptor已经处理了文件保存，这里直接返回文件路径
    // 从file对象中获取保存后的文件名
    const filename = file.filename;

    // 返回相对URL路径
    return `/uploads/avatars/${filename}`;
  }

  // 删除旧头像文件
  public async deleteOldAvatar(avatarUrl: string): Promise<void> {
    if (!avatarUrl || avatarUrl.startsWith('http')) {
      return; // 如果是外部URL或为空，不执行删除操作
    }

    const filepath = path.join('.', avatarUrl);

    if (fs.existsSync(filepath)) {
      try {
        fs.unlinkSync(filepath);
      } catch (error) {
        // 删除失败不抛出异常，继续执行
        console.error('删除旧头像文件失败:', error.message);
      }
    }
  }
}
